package py.una.pol.ii.is2.dao.sistema;

/**
 * Clase que implementa la interfaz UsuarioDAO
 * @author mbenitez
 * @date 30/04/2009
 */
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import py.una.pol.ii.is2.domain.sistema.Rol;
import py.una.pol.ii.is2.domain.sistema.Usuario;
import py.una.pol.ii.is2.util.Criptografia;

@Stateless(mappedName="usuarioDao")
public class UsuarioDAOBean implements UsuarioDAOLocal, UsuarioDAORemote {
    /**
     * Manejador de instancias de entidades para recuperar instancias desde
     * el Persistence Context
     */
    @PersistenceContext
    private EntityManager em;

    @EJB
    private ModuloDAO moduloDao;
    @EJB
    private PantallaDAO pantallaDao;
    /**
     * Inserta una entidad de Usuario en la base de datos. 
     *
     * @param objeto Usuario a insertar
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean insert(Usuario objeto) throws Exception {   //Modificado por lizj 14/05/2009 :)
        boolean retorno = false;
        try {
            Query q = em.createNamedQuery("Usuario.findByUsuaAlias");
            q.setParameter("usuaAlias", objeto.getUsuaAlias().trim());
            q.getSingleResult();
        } catch (NoResultException e) {
            objeto.setUsuaContrasena(new Criptografia().SHA1(objeto.getUsuaContrasena())); //ciframos la clave antes de insertar el registro
            em.persist(objeto);
            retorno = true;
        } finally {
            return retorno;
        }
    }

    /**
     * Actualiza una entidad de Usuario recibida como parámetro
     * en la base de datos. 
     *
     * @param objeto Usuario a editar
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean update(Usuario objeto) throws Exception {
        boolean retorno = false;
        try {
            em.merge(objeto);
            retorno = true;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            return retorno;
        }
    }
    
    public boolean updateRolesAsignados(Usuario objeto) throws Exception {
        boolean retorno = false;
        try {
            em.merge(objeto);
            for (Rol rol : objeto.getRolCollection()) {
                System.out.println("rol : " + rol.getRolCod());
                em.merge(rol);
            }
            
            retorno = true;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            return retorno;
        }
    }

    /**
     * Elimina una entidad de Usuario recibida como parámetro
     * en la base de datos. 
     *
     * @param objeto Usuario a eliminar
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean delete(Usuario objeto) throws Exception {
        boolean retorno = false;
        try {
            Usuario mgdObjeto = em.merge(objeto);
            em.remove(mgdObjeto);
            retorno = true;
        } catch (Exception e) {
            throw e;
        } finally {
            return retorno;
        }
    }

    /**
     * Busca un registro de la tabla Usuario por el codigo de la misma.
     * Utiliza el NamedQuery <b>Caracteristica.findByCaraCod</b> para su efecto.
     *
     * @param codObjeto Código del Usuario buscado
     * @return retorno Usuario encontrado, en otro caso null.
     * @throws java.lang.Exception
     */
    public Usuario find(String codObjeto) throws Exception {
        Usuario retorno = null;
        try {
            Query q = em.createNamedQuery("Usuario.findByUsuaAlias");
            q.setParameter("usuaAlias", codObjeto);
            retorno = (Usuario) q.getSingleResult();
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            return retorno;
        }
    }

    /**
     * Devuelve todas las Usuarios en caso de que el parametro condicion
     * sea o bien <b>null</b> o <b>vacio</b>, y aquellas que coincidan con la condicion
     * comenzando con la palabra clave <b>where</b>.
     * Las entidades son devueltas ordenadas por la clave primaria.
     *
     *
     * @param condicion Restricción para la selección de resultados
     * @return retorno Lista de resultados arrojados por la ejecución de la consulta, en otro caso null.
     * @throws java.lang.Exception
     */
    public List<Usuario> getListaUsuarios(String condicion) throws Exception {
        List<Usuario> retorno = null;
        Query q = null;
        try {
            if (condicion == null || condicion.length() == 0) {
                q = em.createNamedQuery("Usuario.findAll");
            } else {
                q = em.createQuery("select u from Usuario u " + condicion + " order by u.usuaAlias");
            }
            // recuperamos la lista
            retorno = q.getResultList();
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            return retorno;
        }
    }
}